package com.luokangtao.common.util;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.concurrent.TimeUnit;

/**
 * redis分布式锁
 * @author luokangtao
 * @create 2019-07-31 18:34
 *         //初始化key值
 *         String userId="19920511";
 *         //参数1:key 参数2:数值(10秒) 参数3:单位是秒
 *         boolean look = redisLockUtil.lock(userId, 10, TimeUnit.SECONDS);
 *         //如果上锁成功
 *         if(look){
 *             try {
 *                 //业务处理
 *             }finally {
 *                 //释放锁
 *                 redisLockUtil.unLock("lkt");
 *             }
 *         }else {
 *             //如果当前已经存在锁的话
 *             throw new BaseException("请不要频繁操作");
 *         }
 */
public class RedisLockUtil {

    @Autowired
    private  RedisTemplate<String,String> redisTemplate;

    /**
     * 加锁
     * @param key redis key
     * @param expire 过期时间，单位秒
     * @return true:加锁成功，false，加锁失败
     */
    public  boolean lock(String key, int expire, TimeUnit unit) {

        //查询key值是否存在  如果不存在 就进行加锁  判断是否有key所对应的值，有则返回true，没有则返回false
        if(!redisTemplate.hasKey(key)) {
            /**
             * 设置过期时间
             * TimeUnit.DAYS          //天
             * TimeUnit.HOURS         //小时
             * TimeUnit.MINUTES       //分钟
             * TimeUnit.SECONDS       //秒
             * TimeUnit.MILLISECONDS  //毫秒
             */
            redisTemplate.boundValueOps(key).set(key,expire,unit);
            return true;
        }
        //如果当前key值存在,就返回加锁失败
        return false;
    }

    /**
     * 释放锁
     * @param key
     */
    public void unLock(String key) {
        redisTemplate.delete(key);
    }

}
